詳解Terraform第3版 7章
https://gyazo.com/f7bec0609a1a743fbb4ca5e3e0e50472
7章 プロバイダ
プロバイダとは
https://www.plantuml.com/plantuml/png/SoWkIImgAKygvj9M24ajAafCoo_ALNZSjFbnqo8k1UruXQ00Po2jhU0O7louUVhZvhMFcoSyRbhokBc1Im4e7g_W4H8I0692r43KLfKMfU9N3LC5Lk_k781VDKGDbqDgNWhGgG00#.png
コア: Terraform バイナリ. CLIインタフェイス, HCLパーサ・インタープリタ、依存グラフ作成、tfstate 読み出し書き込み
プロバイダ: プラグイン. PRCでコアとやり取りしHTTP経由でプラットフォームとやり取りする
各プロバイダは任意のprefixを確保している e.g. [aws]_instance, [azure]_image
プロバイダのインストールは provider "aws" { region = "ap-northeast-1" }
最新をインストールするのでバージョンを固定するなどしたい場合は記述が必要
code:terraform.tf
terraform {
required_version = ">= 1.0.0, < 2.0.0"
required_providers {
# LOCAL_NAME:
# 基本はプロバイダの preferred local name だが、命名がかぶる場合はここで宣言できる
aws = {
source = "hashicorp/aws"
version = "~> 4.0"
}
}
}
tkdn.icon 今まで登場しなかったものの、required_providers は必ず書こうとある
同じプロバイダを複数使う
例えば複数のAWSリージョン
provider ブロックで alias を指定して扱う
module の場合はどうか
大阪リージョンにレプリカ作ろうとしたら
https://gyazo.com/6c1310c1f5ed569e16a756687a064013
一時的なもの?
https://gyazo.com/1d8c0285964c848a1fa253678450ca87
書籍通りに書いたが allocated_storage をレプリカに指定してWarningが出た
https://gyazo.com/d050635a1d5b11940c1ba94c6f219392
注意1: データ保管は国外でOKかなどガバナンスを考える必要もあるので複数リージョンはエイリアスだけ渡してOKという話ではない
注意2: エイリアスは慎重に。リージョン特定の大規模な障害の場合、実際には1つのモジュールで複数リージョンを扱うとインフラ変更ができない。各リージョンごとにモジュール管理したほうがよい
ではどんなときにエイリアスを???
複数プロバイダにまたがってデプロイするインフラが結合していてまとめてデプロイしたい場合
Cloudfront + TLS証明書(ACM) で発行する場合など. 証明書は us-east-1 で作る必要がある
複数のAWSアカウント
複数のアカウントで管理する理由
分離することでStaging/Productionの取り違えの事故などを未然に防げるかもしれない
認証認可が分けられるので誤って本番DBの削除といった大事故が防げるかもしれない
監査やレポーティングにおいても、操作検知や請求書仕分けを考えれば分けることが合理的
親アカウントから子へRoleを引き受けるように簡単に解説しているが、実際のリアルワールドでは引き受けたいIAMロール にsts:AssumeRoleパーミッションを付与する必要がある
複数のプロバイダをモジュールに
provider ブロックを再利用可能なモジュール(not root module)に定義するのはアンチパターン
設定の問題: AWSプロバイダには設定項目が50個前後オプションがある = モジュールがメンテしづらくなる
重複の問題: 50前後の項目をモジュールを利用するユーザに強いることになる、退屈かつ間違いが起きる
パフォーマンスの問題: プロバイダを動かすために新しいプロセスを起動しPRCを通じてプロセス通信する
プロバイダやリージョンのかけ合わせで 125 個プロセスが起動する筆者の話
ユーザがルートモジュールでproviderブロックを作るようにするには?
設定エイリアスを利用する
プロバイダエイリアスと違って自身はプロバイダを作成しない
一方でモジュールを使うユーザは provider ブロック作成が強制される
providers マップのキーは設定エイリアスと同じでなければならない
マルチクラウドを想定した複数プロバイダ
tkdn.icon k8sなどは仕事で今扱ってないので飛ばしざっくり読む
コントロールプレーン
k8sクラスタ管理担当(代表的には kubectl)、命令・状態保存・クラスタ監視・処理調整
ワーカノード
コンテナを動かすサーバ。どのワーカノードがどのコンテナで動かくべきかはコントロールプレーンが指示
まとめ
複数AWSリージョンにデプロイ: 複数 provider ブロックに region/alias を設定
複数AWSアカウントにデプロイ: 複数 provider ブロックに別々の assume_role ブロック, alias を設定
複数クラウドにデプロイ: 複数の provider ブロックでそれぞれ違うクラウドを設定
また1つのモジュールで複数プロバイダを使うのはアンチパターン
リージョン・アカウント・クラウドはそれぞれ分離し影響範囲を限定して別々のモジュールで扱う